package code.whmmm.util.spring.quartz;

import code.whmmm.util.spring.quartz.util.QuartzUtil;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import code.whmmm.util.simple.TimeUtil;

/**
 * <p>
 * 带有日志记录的 job 包装类,<br/>
 * 如不需要 ，也可以 实现 {@link QuartzJob} 接口
 * <p>
 * <pre>{@code
 * <dependency>
 *     <groupId>org.quartz-scheduler</groupId>
 *     <artifactId>quartz</artifactId>
 *     <version>2.3.1</version>
 *     <scope>provided</scope>
 * </dependency>
 * }</pre>
 * 创建时间: 2019年12月09日 16:29:33
 *
 * @author Zero
 */
public abstract class LogJob implements QuartzJob {

    /**
     * 日志记录名称
     *
     * @return 日志记录的 quartz 定时器名
     */
    protected String getJobLogName() {
        return null;
    }

    protected Logger log = LoggerFactory.getLogger(this.getClass());

    /**
     * <b>不要重写此方法!!!!</b> <br/>
     * doJob 的 wrapper 方法
     *
     * @param context job context
     * @throws JobExecutionException 执行异常
     */
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        long l = TimeUtil.getTimestamp();
        String jobName = getJobLogName();

        if (jobName == null) {
            jobName = this.getClass().getSimpleName();
        }

        log.info(jobName + QuartzUtil.getStartLog());

        try {
            this.doJob(context);
            log.info(jobName + QuartzUtil.getEndLog(l));
        } catch (Exception e) {
            log.error(jobName + " 执行异常");
            log.error(e.getMessage(), e);
        }

    }

    /**
     * <b>具体执行内容 , 不要覆盖 execute 方法</b>
     * <p>已启用 spring tx 事务，适用于单数据源的情况</p>
     *
     * @param context quartz context上下文
     */
    public abstract void doJob(JobExecutionContext context);
}
